"""
目标适用于：
    列表推导式
    字典推导式
    集合推导式
"""
"""
列表推导式：
    作用：用一个表达式创建一个有规律的列表或控制一个有规律的列表。
        列表推导式又叫列表生成式
"""
"""需求一： 创建一个0~10的列表"""
# while循环实现
list1 = []
n = 0
while n <= 10:
    list1.append(n)
    n += 1
print(list1)

# for循环实现
list2 = []
for i in range(11):
    list2.append(i)
print(list2)

# 列表推导式
list3 = [i for i in range(11)]
print(list3)

"""需求二：创建0~10的偶数列表"""
# while循环实现
l1 = []
n = 0
while n <= 10:
    if n % 2 == 0:
        l1.append(n)
    n += 1
print(l1)

# for循环实现
l2 = []
for i in range(11):
    if i % 2 == 0:
        l2.append(i)
print(l2)

# 列表推导式
l3 = [i for i in range(11) if i % 2 == 0]
print(l3)

"""需求三：多个for循环实现"""
# 需求：创建列表如下：
#   [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

# for循环实现
li1 = []
for i in range(1,3):
    for j in range(3):
        li1.append((i, j))
print(li1)

# 列表推导式
li2 = [(n, m) for n in range(1, 3) for m in range(3)]
print(li2)


"""
字典推导式
    作用：快速合并列表为字典或提取字典中目标数据
"""
"""创建一个字典：字典key是1~5数字，value是这个数字的2次方"""
# for 循环实现
dict1 = {}
for i in range(1, 6):
    dict1[i] = i**2
print(dict1)

# 字典推导式实现
dict2 = {k: k**2 for k in range(1, 6)}
print(dict2)

"""将以下两个列表合并成一个字典"""
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
# for循环方式
dict3 = {}
for i in range(len(list1)):
    dict3[list1[i]] = list2[i]
print(dict3)

# 列表推导式
dict4 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict4)

"""需求：提取下述电脑数量大于等于200的字典数据"""
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
# for循环-先实现一边整个的内容
dict5 = {}
for k in counts:
    dict5[k] = counts[k]
print(dict5)
# 字典推导式
dict6 = {k: counts[k] for k in counts }
print(dict6)


# 提取大于等于200的数据
# for循环提取
dict7 = {}
for k in counts:
    if counts[k] >= 200:
        dict7[k] = counts[k]
print(dict7)
# 字典推导式
dict8 = {k: counts[k] for k in counts if counts[k] >= 200}
print(dict8)

# 将for循环方式 转换成推导式形式
dict9 = {}
for k, v in counts.items():
    if v >= 200:
        dict9[k] = v
print(dict9)

dict10 = {k: v for k, v in counts.items() if v >= 200}
print(dict10)

"""
集合推导式
"""

"""需求：创建一个集合，数据为下方列表的2次方"""
# PS：集合会去重
list1 = [1, 1, 2]
# for循环实现
set1 = set() # 因为要先创建一个空的集合用于接受数据，而空集合 =set()
for s in list1:
    set1.add(s**2)
print(set1)
# 集合推导式
set2 = {s**2 for s in list1}
print(set2)
